package controller;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

import model.Administrador;
import model.Endereco;
import dao.AdministradorDAO;

public class AdministradorController implements ControllerBrowse {

	private AdministradorDAO administradorDAO;
	private static AdministradorController instance;

	private AdministradorController() {
	}

	public static AdministradorController getInstance() {
		if (instance == null) {
			instance = new AdministradorController();
		}
		return instance;
	}

	public boolean inserirAdministrador(String cpf, String nome, String email, 
			String senha, String profissao, String dataNascimento, String logradouro, 
			String numero, String cidade, String cep) throws Exception {
		Endereco endereco = new Endereco(logradouro, numero, cidade, cep);
		Administrador administrador = new Administrador(0, cpf, nome, email, senha, profissao, dataNascimento, endereco);
		
		validaAdministrador(administrador);
		return getAdministradorDAO().inserir(administrador);
	}

	public boolean alterarAdministrador(int id, String cpf, String nome, String email, 
			String senha, String profissao, String dataNascimento, String logradouro, 
			String numero, String cidade, String cep) throws Exception {
		
		Administrador administrador = buscarAdministradorPorId(id);
		
		administrador.setCpf(cpf);
		administrador.setNome(nome);
		administrador.setEmail(email);
		administrador.setSenha(senha);
		administrador.setProfissao(profissao);
		administrador.setDataNascimento(dataNascimento);
		//Endere�o
		administrador.getEndereco().setLogradouro(logradouro);
		administrador.getEndereco().setNumero(numero);
		administrador.getEndereco().setCidade(cidade);
		administrador.getEndereco().setCep(cep);

		validaAdministrador(administrador);
		return getAdministradorDAO().alterar(administrador);
	}

	public boolean excluirAdministrador(int id) throws Exception {
		Administrador administrador = buscarAdministradorPorId(id);
		return getAdministradorDAO().delete(administrador);
	}

	public Boolean verificaAdministradorSenha(String email, String senha)
			throws Exception {
		return getAdministradorDAO().verificaAdministradorSenha(email, senha);
	}

	public void validaAdministrador(Administrador administrador)
			throws Exception {
		if (administrador.getCpf() == null || administrador.getCpf().isEmpty()) {
			throw new Exception("CPF n�o informado.");
		}
		if (administrador.getNome() == null || administrador.getNome().isEmpty()) {
			throw new Exception("Nome n�o informado!");
		}
		if (administrador.getDataNascimento() == null) {
			throw new Exception("Data de nascimento n�o informada!");
		}
		if (administrador.getEmail() == null || administrador.getEmail().isEmpty()) {
			throw new Exception("E-mail n�o informado!");
		}
		if (administrador.getProfissao() == null || administrador.getProfissao().isEmpty()) {
			throw new Exception("Profiss�o n�o informada!");
		}
		if (administrador.getSenha() == null || administrador.getSenha().isEmpty()) {
			throw new Exception("Senha n�o informada!");
		}
		if (administrador.getEndereco().getLogradouro() == null || administrador.getEndereco().getLogradouro().isEmpty()) {
			throw new Exception("Rua n�o informada!");
		}
		if (administrador.getEndereco().getNumero() == null || administrador.getEndereco().getNumero().isEmpty()) {
			throw new Exception("N�mero n�o informado!");
		}
		if (administrador.getEndereco().getCep() == null || administrador.getEndereco().getCep().isEmpty()) {
			throw new Exception("Cep n�o informado!");
		}
		if (administrador.getEndereco().getCidade() == null || administrador.getEndereco().getCidade().isEmpty()) {
			throw new Exception("Cidade n�o informada!");
		}
	}
	
	public Administrador buscarAdministradorPorId(int id) throws Exception {
		return getAdministradorDAO().buscarAdministradorPorId(id);
	}


	public AdministradorDAO getAdministradorDAO() {
		if (administradorDAO == null) {
			administradorDAO = new AdministradorDAO();
		}
		return administradorDAO;
	}

	@Override
	public ArrayList<HashMap<String, Object>> buscarDados() throws SQLException {
		return (ArrayList<HashMap<String, Object>>) getAdministradorDAO().buscarDadosAdministradorBrowse();
	}



}
